﻿#define  _CRT_SECURE_NO_WARNINGS   1
#include <iostream>
#include <string>
using namespace std;
#include <Windows.h>
//异常
//抛出异常之后，会被catch捕捉，代码直接跳到catch执行代码
//throw之后代码不再执行，catch之后代码继续执行
//catch捕捉适合或最近的

struct  String :string
{
	String(const char*s1=" ")
		:s(s1)
	{
		cout << "&" << endl;
	}
	String(const String& s1)
	{
		s = s1;
		cout << "&&&" << endl;
	}
	~String()
	{
		cout << "~" << endl;
	}
private:
	string s;
};
double Divide(int a, int b)
{
	try
	{
		// 当b == 0时抛出异常
		if (b == 0)
		{
			string s("Divide by zero condition!");
			throw s;
		}
		else
		{
			return ((double)a / (double)b);
		}
	}
	catch (int errid)
	{
		cout << errid << endl;
	}
	return 0;
}
void Func()
{
	int len, time;
	cin >> len >> time;
	try
	{
		cout << Divide(len, time) << endl;
	}
	catch (const char* errmsg)
	{
		cout << errmsg << endl;
	}
	cout << __FUNCTION__ << ":" << __LINE__ << "⾏执⾏" << endl;
}
//以⼀般main函数中最后都会使⽤catch(...)，它可以捕获任意类型的异常，但是是不知道异常错误是什么
int main()
{
	//while (1)
	//{
	//	try
	//	{
	//		Func();
	//	}
	//	catch (const string & errmsg)
	//	{
	//		cout << errmsg << endl;
	//	}
	//	catch (...)
	//	{
	//		//以⼀般main函数中最后都会使⽤catch(...)，它可以捕获任意类型的异常，但是是不知道异常错误是什么
	//	}
	//}
	int i = 0;
	while (i <= 20)
	{
		printf("%-2d%%\r", i);
		Sleep(200);
		i++;
	}
	printf("%-2d%%\n", 20);
	return 0;
}

//异常对象会在异常被完全处理后自动销毁，具体是在：对应的 catch 块执行结束后若 catch 块中重新抛出异常（throw; ），则原异常对象会在新异常被捕获并处理后销毁因此，在 catch 块内部，无论使用值捕获还是引用捕获，异常对象都是有效的。